/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import Entidad.Custodia;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Juan
 */
public class CustodiaDAO {
    
    private static final String SQL_INSERT =
            "INSERT INTO custodia ("
            + "muestras_id_muestra, cantidad_contramuestra, cantidad_muestra_analisis, fecha_almacenamiento, responsable_almacenamiento,"
            + "cantidad_sobrantes, fecha_devolucion_sobrantes, cantidad_muestra_devolucion, fecha_disposicion_devolucion,"
            + "responsable_disposicion, observaciones"
            + ") VALUES (?,?,?,?,?,?,?,?,?,?,?)";
    private static final String SQL_SELECT =
            "SELECT * "
            + "  FROM custodia WHERE muestras_id_muestra = ?";
    private static final String SQL_SELECT_All =
            "SELECT * "
            + "FROM custodia";
    private static final String SQL_UPDATE =
            "UPDATE custodia SET "
            + "cantidad_contramuestra = ?, cantidad_muestra_analisis = ?, fecha_almacenamiento = ?, responsable_almacenamiento = ?,"
            + "cantidad_sobrantes = ?, fecha_devolucion_sobrantes = ?, cantidad_muestra_devolucion = ?, fecha_disposicion_devolucion = ?,"
            + "responsable_disposicion = ?, observaciones = ?"
            + " WHERE "
            + "muestras_id_muestra = ? ";

    /* SQL to delete data */
    private static final String SQL_DELETE =
            "DELETE FROM custodia WHERE "
            + "muestras_id_muestra = ?";

    public void create(Custodia custodia, Connection conexion) throws SQLException {

        PreparedStatement ps = null;
        try {
            ps = conexion.prepareStatement(SQL_INSERT);
            ps.setInt(1, custodia.getMuestrasIDMuestra());
            ps.setDouble(2, custodia.getCantidadContramuestra());
            ps.setDouble(3, custodia.getCantidadMuestraAnalisis());
            ps.setDate(4, custodia.getFechaAlmacenamiento());
            ps.setString(5, custodia.getResponsableAlmacenamiento());
            ps.setDouble(6, custodia.getCantidadSobrantes());
            ps.setDate(7, custodia.getFechaDevolucionSobrantes());
            ps.setDouble(8, custodia.getCantidadMuestraDevolucion());
            ps.setDate(9, custodia.getFechaDisposicionDevolucion());
            ps.setString(10, custodia.getResponsableDisposicion());
            ps.setString(11, custodia.getObservaciones());
           
            ps.executeUpdate();
        } finally {
            cerrar(ps);
        }
    }

    public Custodia load(Custodia custodia, Connection conexion) throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conexion.prepareStatement(SQL_SELECT);
            ps.setInt(1, custodia.getMuestrasIDMuestra());
            rs = ps.executeQuery();
            List results = getResults(rs);
            if (results.size() > 0) {
                return (Custodia)results.get(0);
            } else {
                return null;
            }
        } finally {
            cerrarRs(rs);
            cerrar(ps);
        }
   }
    
    public List loadAll(Connection conexion) throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conexion.prepareStatement(SQL_SELECT_All);
            rs = ps.executeQuery();
            List results = getResults(rs);
            if (results.size() > 0) {
                return results;
            } else {
                return null;
            }
        } finally {
            cerrarRs(rs);
            cerrar(ps);
        }
    }

    public void update(Custodia custodia, Connection conexion) throws SQLException {
        PreparedStatement ps = null;
        try {
            ps = conexion.prepareStatement(SQL_UPDATE);
            
            ps.setDouble(1, custodia.getCantidadContramuestra());
            ps.setDouble(2, custodia.getCantidadMuestraAnalisis());
            ps.setDate(3, custodia.getFechaAlmacenamiento());
            ps.setString(4, custodia.getResponsableAlmacenamiento());
            ps.setDouble(5, custodia.getCantidadSobrantes());
            ps.setDate(6, custodia.getFechaDevolucionSobrantes());
            ps.setDouble(7, custodia.getCantidadMuestraDevolucion());
            ps.setDate(8, custodia.getFechaDisposicionDevolucion());
            ps.setString(9, custodia.getResponsableDisposicion());
            ps.setString(10, custodia.getObservaciones());
            ps.setInt(11, custodia.getMuestrasIDMuestra());
            
            ps.executeUpdate();
            
        } finally {
            cerrar(ps);
        }
    }

    public void delete(Custodia custodia, Connection conexion) throws SQLException {
        PreparedStatement ps = null;
        try {
            ps = conexion.prepareStatement(SQL_DELETE);
            ps.setInt(1, custodia.getMuestrasIDMuestra());
            ps.executeUpdate();
        } finally {
            cerrar(ps);
        }
    }

    private List getResults(ResultSet rs) throws SQLException {
        List results = new ArrayList();
        while (rs.next()) {
            
            Custodia custodia = new Custodia(rs.getInt("muestras_id_muestra"));
            
            custodia.setCantidadContramuestra(rs.getDouble("cantidad_contramuestra"));
            custodia.setCantidadMuestraAnalisis(rs.getDouble("cantidad_muestra_analisis"));
            custodia.setCantidadMuestraDevolucion(rs.getDouble("cantidad_muestra_devolucion"));
            custodia.setCantidadSobrantes(rs.getDouble("cantidad_sobrantes"));
            custodia.setFechaAlmacenamiento(rs.getDate("fecha_almacenamiento"));
            custodia.setFechaDevolucionSobrantes(rs.getDate("fecha_devolucion_sobrantes"));
            custodia.setFechaDisposicionDevolucion(rs.getDate("fecha_disposicion_devolucion"));
            custodia.setObservaciones(rs.getString("observaciones"));
            custodia.setResponsableAlmacenamiento(rs.getString("responsable_almacenamiento"));
            custodia.setResponsableDisposicion(rs.getString("responsable_disposicion"));
            
            results.add(custodia);
        }
        return results;
    }

    private void cerrar(PreparedStatement ps) throws SQLException {
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
            }
        }
    }

    private void cerrarRs(ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
            }
        }
    }

    private void cerrarCnn(Connection cnn) {
        if (cnn != null) {
            try {
                cnn.close();
            } catch (SQLException e) {
            }
        }
    }

}
